题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
思路
还是一样的说法,链表的问题只要思路清晰,并且保证没有访问到错误的值,比如NULL,或者对NULL求next,一般没有多大的问题,下面这个问题因为是每两个节点交换,所以最后是有一个额外的节点,用来辅助交换,保存节点信息,下面就具体举例:
要将链表1->2->3->4->5两两进行交换,首先申请一个辅助节点ahead,将其的后继节点设为1,将辅助节点后面节点称为p1节点,将p1后面的那个节点称为nex,这样原链表变成了res->1->2->3->4->5,1其中p1指向1,nex指向2,其后将p1和nex进行交换。
交换的步骤要注意顺序,否则会丢失掉节点信息,首先将ahead的后继节点换成nex,然后将p1的后继节点换成nex的后继节点,最后将nex的后继节点换成p1,这样原来的ahead->p1->nex->(nex->next)就变成了ahead->nex->p1->(nex->next),交换结束然后再调整ahead、p1、nex指向的节点,这里要注意,如果说后面剩下的节点个数只有1个,那么就不用继续交换了,如果说还有大于1个节点,就继续进行交换。将ahead指向交换之后的后一个节点,也就是ahead->nex->p1->(nex->next)中的p1,然后将p1指向ahead->next,nex指向ahead->next->next,这样又进行新一轮的交换,直到最后交换结束。
code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* ahead=new ListNode(0);
ListNode* res=ahead;
if(!(head&&head->next))
{
return head;
}
ListNode* p1=head;
ListNode* nex=head->next;
while(1)
{
ahead->next=nex;
p1->next=nex->next;
nex->next=p1;
ahead=p1;
if(ahead->next&&ahead->next->next)
{
p1=p1->next;
nex=p1->next;
}
else
break;
}
return res->next;
}
};